package ve.ucv.patologiaocular.showcase;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import ve.ucv.patologiaocular.dao.EstudioDAO;
import ve.ucv.patologiaocular.dao.EstudioDAOImpl;
import ve.ucv.patologiaocular.domain.Estudio;
import ve.ucv.patologiaocular.util.ListaCruceDeDatos;

import com.opensymphony.xwork2.ActionSupport;

public class CruzarDatos extends ActionSupport {

	private static final long serialVersionUID = -1107726728491034330L;
	private static final Log log = LogFactory.getLog(CruzarDatos.class);
	private EstudioDAO estudioDAO = null;
	private List<ListaCruceDeDatos> gridModel;
	private List<ListaCruceDeDatos> listaCruceDeDatos;
	private List<Estudio> estudios;
	private Integer rows = 0;
	private Integer page = 0;
	private Integer total = 0;
	private Integer records = 0;
	private boolean loadonce = false;
	private String nombre;
	private String apellido;
	private String nombreProyecto;
	private String tipoSolicitud;
	private String ano;
	private String codigo;
	private String centro;
	private String diagClinico;
	private String diagAnatomopat;
	private String edad;
	private String mes;
	private String edad2;
	private String edad3;
	private String mes2;
	private String mes3;
	
	public String execute() {
		log.debug("Page " + getPage()+" Rows " + getRows());
		this.estudioDAO = new EstudioDAOImpl();
		
		if(nombre == null && apellido == null && nombreProyecto == null && tipoSolicitud == null && ano == null && codigo == null && centro == null && diagClinico == null && 
				diagAnatomopat == null && edad == null && mes == null && edad2 == null && edad3 == null && mes2 == null && mes3 == null){
			estudios = estudioDAO.listarEstudios();
		}
		else{
			if(!edad.equals("") || !mes.equals("") ){
				if(centro.equals("-1") || centro.equals("")){
					estudios = estudioDAO.cruzarDatos(nombre, apellido, nombreProyecto, tipoSolicitud, codigo, ano, "", diagClinico, diagAnatomopat, edad, mes);
				}
				else{
					estudios = estudioDAO.cruzarDatos(nombre, apellido, nombreProyecto, tipoSolicitud, codigo, ano, centro, diagClinico, diagAnatomopat, edad, mes);
				}
			}
			else{
				if(!edad2.equals("") || !edad3.equals("")){
					if(centro.equals("-1") || centro.equals("")){
						estudios = estudioDAO.cruzarDatosRangoEdades(nombre, apellido, nombreProyecto, tipoSolicitud, codigo, ano, "", diagClinico, diagAnatomopat, edad2, edad3);
					}
					else{
						estudios = estudioDAO.cruzarDatosRangoEdades(nombre, apellido, nombreProyecto, tipoSolicitud, codigo, ano, centro, diagClinico, diagAnatomopat, edad2, edad3);
					}
				}
				else{
					if(!mes2.equals("") || !mes3.equals("")){
						if(centro.equals("-1") || centro.equals("")){
							estudios = estudioDAO.cruzarDatosRangoMeses(nombre, apellido, nombreProyecto, tipoSolicitud, codigo, ano, "", diagClinico, diagAnatomopat, mes2, mes3);
						}
						else{
							estudios = estudioDAO.cruzarDatosRangoMeses(nombre, apellido, nombreProyecto, tipoSolicitud, codigo, ano, centro, diagClinico, diagAnatomopat, mes2, mes3);
						}
					}
					else{
						if(centro.equals("-1") || centro.equals("")){
							estudios = estudioDAO.cruzarDatos(nombre, apellido, nombreProyecto, tipoSolicitud, codigo, ano, "", diagClinico, diagAnatomopat, edad, mes);
						}
						else{
							estudios = estudioDAO.cruzarDatos(nombre, apellido, nombreProyecto, tipoSolicitud, codigo, ano, centro, diagClinico, diagAnatomopat, edad, mes);
						}
					}
				}
			}
		}
		
		if(estudios.size() > 0){
    		listaCruceDeDatos = new ArrayList<ListaCruceDeDatos>();
    		
    		for(Estudio e : estudios){
    			String nom = "";
				String ed = "";
				String c = e.getSolicitudId().getTipoSolicitud().concat("-").concat(e.getSolicitudId().getCodigo()).concat("-").concat(e.getSolicitudId().getAno());
				String cen = e.getSolicitudId().getCentroMedicoId().getCentroDeSaludId().getNombre();
				String diagC = e.getSolicitudId().getDiagClinico();
    			if(e.getSolicitudId().getPacienteId() != null){
    				nom = e.getSolicitudId().getPacienteId().getNombre().concat(" ").concat(e.getSolicitudId().getPacienteId().getApellido());
    				if(e.getSolicitudId().getPacienteId().getAnos() > 0)
    					ed = String.valueOf(e.getSolicitudId().getPacienteId().getAnos()).concat(" A ");
    				if(e.getSolicitudId().getPacienteId().getMeses() > 0)
    					ed = ed.concat(String.valueOf(e.getSolicitudId().getPacienteId().getMeses())).concat(" M");    				
	    			listaCruceDeDatos.add(new ListaCruceDeDatos(e.getId(), nom, ed, c , cen, diagC, e.getDiagAnatomopat()));
    			}
    			if(e.getSolicitudId().getProyectoId() != null){
    				nom = e.getSolicitudId().getProyectoId().getNombre();
    				listaCruceDeDatos.add(new ListaCruceDeDatos(e.getId(), nom, "", c , cen, diagC, e.getDiagAnatomopat()));
    			}
    		}
    	}
		
		if(estudios.size() == 0){
			setRecords(0);
		}
		else{
			setRecords(listaCruceDeDatos.size());
		}

	    int to = (getRows() * getPage());
	    int from = to - getRows();

	    if (to > getRecords()) to = getRecords();

	    if (loadonce)
	    {
	    	if(estudios.size() == 0){
	    		setGridModel(null);
	    	}
	    	else{
	    		setGridModel(listaCruceDeDatos);
	    	}
	    }
	    else
	    {
	    	if(estudios.size() == 0){
	    		setGridModel(null);
	    	}
	    	else{
	    		setGridModel(listaCruceDeDatos.subList(from, to));
	    	}
	    }
	    
	    setTotal((int) Math.ceil((double) getRecords() / (double) getRows()));
    	
		return SUCCESS;
	}
	
	public String getJSON()
	{
	    return execute();
	}

	public EstudioDAO getEstudioDAO() {
		return estudioDAO;
	}

	public void setEstudioDAO(EstudioDAO estudioDAO) {
		this.estudioDAO = estudioDAO;
	}

	public List<ListaCruceDeDatos> getGridModel() {
		return gridModel;
	}

	public void setGridModel(List<ListaCruceDeDatos> gridModel) {
		this.gridModel = gridModel;
	}

	public List<ListaCruceDeDatos> getListaCruceDeDatos() {
		return listaCruceDeDatos;
	}

	public void setListaCruceDeDatos(List<ListaCruceDeDatos> listaCruceDeDatos) {
		this.listaCruceDeDatos = listaCruceDeDatos;
	}

	public List<Estudio> getEstudios() {
		return estudios;
	}

	public void setEstudios(List<Estudio> estudios) {
		this.estudios = estudios;
	}
	
	public Integer getRows() {
		return rows;
	}

	public void setRows(Integer rows) {
		this.rows = rows;
	}

	public Integer getPage() {
		return page;
	}

	public void setPage(Integer page) {
		this.page = page;
	}

	public Integer getTotal() {
		return total;
	}

	public void setTotal(Integer total) {
		this.total = total;
	}

	public Integer getRecords() {
		return records;
	}

	public void setRecords(Integer records) {
		this.records = records;
		
		if (this.records > 0 && this.rows > 0)
	    {
	      this.total = (int) Math.ceil((double) this.records / (double) this.rows);
	    }
	    else
	    {
	      this.total = 0;
	    }
	}

	public boolean isLoadonce() {
		return loadonce;
	}

	public void setLoadonce(boolean loadonce) {
		this.loadonce = loadonce;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public String getNombreProyecto() {
		return nombreProyecto;
	}

	public void setNombreProyecto(String nombreProyecto) {
		this.nombreProyecto = nombreProyecto;
	}

	public String getTipoSolicitud() {
		return tipoSolicitud;
	}

	public void setTipoSolicitud(String tipoSolicitud) {
		this.tipoSolicitud = tipoSolicitud;
	}

	public String getAno() {
		return ano;
	}

	public void setAno(String ano) {
		this.ano = ano;
	}

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public String getCentro() {
		return centro;
	}

	public void setCentro(String centro) {
		this.centro = centro;
	}

	public String getDiagClinico() {
		return diagClinico;
	}

	public void setDiagClinico(String diagClinico) {
		this.diagClinico = diagClinico;
	}

	public String getDiagAnatomopat() {
		return diagAnatomopat;
	}

	public void setDiagAnatomopat(String diagAnatomopat) {
		this.diagAnatomopat = diagAnatomopat;
	}
	
	public String getEdad() {
		return edad;
	}

	public void setEdad(String edad) {
		this.edad = edad;
	}

	public String getMes() {
		return mes;
	}

	public void setMes(String mes) {
		this.mes = mes;
	}

	public String getEdad2() {
		return edad2;
	}

	public void setEdad2(String edad2) {
		this.edad2 = edad2;
	}

	public String getEdad3() {
		return edad3;
	}

	public void setEdad3(String edad3) {
		this.edad3 = edad3;
	}

	public String getMes2() {
		return mes2;
	}

	public void setMes2(String mes2) {
		this.mes2 = mes2;
	}

	public String getMes3() {
		return mes3;
	}

	public void setMes3(String mes3) {
		this.mes3 = mes3;
	}
}
